package com.elasticjob.config;

import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.JobTypeConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
import com.dangdang.ddframe.job.event.JobEventConfiguration;
import com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
import com.elasticjob.job.FileDataflowJob;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;

/**
 * 把大的任务进行细化进行拆分:
 * 根据type进行拆分，把大的任务根据类型拆分4个小的任务
 * <p>
 * 1 备份type=text backerUp=0 数据,2 备份type=image backerUp=0 数据...
 * 在一台机器中 开启4个线程同时去执行你4个任务
 * 如果在两台机器中，每台机器中开启2个线程执行我们的任务
 * 如果在三台机器中，一台开启2个，另外两台开启1个线程执行我们的任务
 * 如果在四台机器汇总，每台机器中开启1个线程执行我们的任务
 */
@Configuration
public class ElasticJobConfig {

    @Autowired
    private CoordinatorRegistryCenter registryCenter;
    @Autowired
    private DataSource dataSource;

//    @Bean(initMethod = "init")
//    public SpringJobScheduler springJobScheduler(MyElasticJob myElasticJob) {
//        return new SpringJobScheduler(
//                myElasticJob,//第一个参数:任务类
//                registryCenter,//第一个参数:注册中心
//                createJobConfiguration(
//                        "spirngbootDemo",
//                        "0/5 * * * * ?",
//                        MyElasticJob.class)
//        );
//    }


/*    @Bean(initMethod = "init")
    public SpringJobScheduler springJobScheduler(FileCustomElasticJob fileCustomElasticJob) {
        return new SpringJobScheduler(
                fileCustomElasticJob,//第一个参数:任务类
                registryCenter,//第一个参数:注册中心
                createJobConfiguration(
                        "fileCustomJob",
                        "0/5 * * * * ?",
                        FileCustomElasticJob.class,
                        4,
                        "0=text,1=image,2=radio,3=vedio"
                ));
    }*/

    @Bean(initMethod = "init")
    public SpringJobScheduler springJobScheduler(FileDataflowJob fileDataflowJob) {
        //增加任务事件追踪配置
        JobEventConfiguration jobEventConfiguration = new JobEventRdbConfiguration(dataSource);
        return new SpringJobScheduler(
                fileDataflowJob,//第一个参数:任务类
                registryCenter,//第一个参数:注册中心
                createJobConfiguration(
                        "dataFlowJob",
                        "0/5 * * * * ?",
                        FileDataflowJob.class,
                        1,
                        "",
                        true
                ), jobEventConfiguration);
    }

    private static LiteJobConfiguration createJobConfiguration(String jobName,
                                                               String cron,
                                                               Class clz,
                                                               int shardingCount,
                                                               String shardingParam,
                                                               boolean isDataFlow) {
        //创建作业配置
        // ...
        // 定义作业核心配置
        JobCoreConfiguration.Builder builder = JobCoreConfiguration.newBuilder(
                jobName,//第一个参数:任务名称
                cron,//第二个参数:cron表达式
                shardingCount //第三个参数:分片数量
        );
        //如果分片参数不为空需要设置分页参数
        if (!StringUtils.isEmpty(shardingParam)) {
            builder.shardingItemParameters(shardingParam);
        }
        JobCoreConfiguration simpleCoreConfig = builder.build();
        JobTypeConfiguration jobTypeConfiguration = null;
        if (isDataFlow) {
            jobTypeConfiguration = new DataflowJobConfiguration(
                    simpleCoreConfig,
                    clz.getCanonicalName(),
                    true);
        } else {
            // 定义SIMPLE类型配置
            /*SimpleJobConfiguration simpleJobConfig*/
            jobTypeConfiguration
                    = new SimpleJobConfiguration(
                    simpleCoreConfig,
                    clz.getCanonicalName());
        }
        // 定义Lite作业根配置
        //overwrite:用自己写的配置覆盖掉默认的配置(ElasticJob只加载第一次信息,后面即使改了它也不会读,因此需要覆盖(个人理解))
        LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(/*simpleJobConfig*/jobTypeConfiguration).overwrite(true).build();
        return simpleJobRootConfig;
    }


}